using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System;

/// <summary>
/// 暂停菜单管理器，处理ESC键暂停/恢复游戏及UI界面显示
/// </summary>
public class PauseMenu : MonoBehaviour
{
    [Header("UI引用")]
    [Tooltip("暂停菜单面板，包含所有暂停相关UI元素")]
    public GameObject pausePanel;

    [Tooltip("继续按钮")]
    public Button resumeButton;

    [Tooltip("重新开始按钮")]
    public Button restartButton;

    [Tooltip("退出按钮")]
    public Button quitButton;

    [Header("场景跳转设置")]
    [Tooltip("主菜单场景名称，默认为'开始界面'")]
    public string mainMenuSceneName = "开始界面";

    [Tooltip("返回主菜单按钮")]
    public Button mainMenuButton;

    [Header("设置")]
    [Tooltip("是否在暂停时显示鼠标光标")]
    public bool showCursorOnPause = true;

    [Tooltip("是否在暂停时锁定鼠标位置")]
    public bool lockCursorOnResume = true;

    private bool isPaused = false; // 当前暂停状态
    private static PauseMenu instance; // 单例实例

    /// <summary>
    /// 单例实例，确保全局唯一访问点
    /// </summary>
    public static PauseMenu Instance
    {
        get
        {
            if (instance == null)
            {
                Debug.LogError("PauseMenu实例不存在，请在场景中添加PauseMenu组件");
            }
            return instance;
        }
    }

    private void Awake()
    {
        // 单例模式实现
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(gameObject); // 切换场景时不销毁
        }
        else
        {
            Destroy(gameObject);
            return;
        }

        // 初始化UI状态
        if (pausePanel != null)
        {
            pausePanel.SetActive(false); // 默认隐藏暂停面板
        }

        // 绑定按钮事件
        BindButtonEvents();
    }

    private void Update()
    {
        // 检测ESC键按下
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            if (isPaused)
            {
                ResumeGame(); // 如果已暂停则恢复
            }
            else
            {
                PauseGame(); // 如果未暂停则暂停
            }
        }
    }

    /// <summary>
    /// 绑定所有按钮事件
    /// </summary>
    private void BindButtonEvents()
    {
        if (resumeButton != null)
        {
            resumeButton.onClick.AddListener(ResumeGame);
        }
        else
        {
            Debug.LogWarning("未分配resumeButton，请在Inspector中指定继续按钮");
        }

        if (restartButton != null)
        {
            restartButton.onClick.AddListener(RestartGame);
        }
        else
        {
            Debug.LogWarning("未分配restartButton，请在Inspector中指定重新开始按钮");
        }

        if (quitButton != null)
        {
            quitButton.onClick.AddListener(QuitGame);
        }
        else
        {
            Debug.LogWarning("未分配quitButton，请在Inspector中指定退出按钮");
        }

        if (mainMenuButton != null)
        {
            mainMenuButton.onClick.AddListener(LoadMainMenu);
        }
        else
        {
            Debug.LogWarning("未分配mainMenuButton，请在Inspector中指定返回主菜单按钮");
        }
    }

    /// <summary>
    /// 暂停游戏
    /// </summary>
    public void PauseGame()
    {
        if (pausePanel == null)
        {
            Debug.LogError("未分配pausePanel，请在Inspector中指定暂停菜单面板");
            return;
        }

        isPaused = true;
        Time.timeScale = 0f; // 暂停游戏时间
        pausePanel.SetActive(true); // 显示暂停面板

        // 处理鼠标光标
        if (showCursorOnPause)
        {
            Cursor.visible = true;
            Cursor.lockState = CursorLockMode.None;
        }

        Debug.Log("游戏已暂停");
    }

    /// <summary>
    /// 恢复游戏
    /// </summary>
    public void ResumeGame()
    {
        isPaused = false;
        Time.timeScale = 1f; // 恢复游戏时间
        if (pausePanel != null)
        {
            pausePanel.SetActive(false); // 隐藏暂停面板
        }

        // 恢复鼠标状态
        if (lockCursorOnResume)
        {
            Cursor.visible = false;
            Cursor.lockState = CursorLockMode.Locked;
        }

        Debug.Log("游戏已恢复");
    }

    /// <summary>
    /// 重新开始当前场景
    /// </summary>
    public void RestartGame()
    {
        Time.timeScale = 1f; // 确保时间恢复正常
        string currentSceneName = SceneManager.GetActiveScene().name;
        SceneManager.LoadScene(currentSceneName); // 重新加载当前场景
        Debug.Log("游戏已重新开始");
    }

    /// <summary>
    /// 退出游戏
    /// </summary>
    public void QuitGame()
    {
        Time.timeScale = 1f; // 确保时间恢复正常

        // 在编辑器中退出播放模式，在构建版本中退出应用
#if UNITY_EDITOR
        UnityEditor.EditorApplication.isPlaying = false;
#else
        Application.Quit();
#endif

        Debug.Log("游戏已退出");
    }

    /// <summary>
    /// 跳转到主菜单场景
    /// </summary>
    public void LoadMainMenu()
    {
        if (string.IsNullOrEmpty(mainMenuSceneName))
        {
            Debug.LogError("主菜单场景名称未设置，请在Inspector中指定mainMenuSceneName");
            return;
        }

        Time.timeScale = 1f; // 确保时间恢复正常
        SceneManager.LoadScene(mainMenuSceneName);
        Debug.LogFormat("跳转到主菜单场景: {0}", mainMenuSceneName);
    }

    /// <summary>
    /// 编辑器模式下验证参数
    /// </summary>
    private void OnValidate()
    {
        if (pausePanel == null)
        {
            Debug.LogWarning("PauseMenu: 未分配pausePanel");
        }

        if (string.IsNullOrEmpty(mainMenuSceneName))
        {
            Debug.LogWarning("PauseMenu: 主菜单场景名称未设置");
        }
    }
}

/// <summary>
/// 使用说明：
/// 1. 创建一个空物体，命名为"PauseMenu"并添加此脚本
/// 2. 创建UI面板(PausePanel)包含以下元素：
///    - 继续按钮(ResumeButton)
///    - 重新开始按钮(RestartButton)
///    - 退出按钮(QuitButton)
/// 3. 在Inspector中将UI元素拖拽到对应字段：
///    - 将PausePanel拖拽到pausePanel字段
///    - 将各按钮拖拽到对应的resumeButton、restartButton、quitButton字段
/// 4. 调整设置选项：
///    - showCursorOnPause: 暂停时是否显示鼠标光标
///    - lockCursorOnResume: 恢复时是否锁定鼠标
/// 5. 按ESC键即可触发暂停/恢复功能
/// 6. 可通过代码调用以下方法：
///    - PauseMenu.Instance.PauseGame() - 暂停游戏
///    - PauseMenu.Instance.ResumeGame() - 恢复游戏
///    - PauseMenu.Instance.RestartGame() - 重新开始游戏
///    - PauseMenu.Instance.QuitGame() - 退出游戏
///    - PauseMenu.Instance.LoadMainMenu() - 跳转到主菜单
/// 7. 场景跳转设置：
///    - 在Inspector中设置mainMenuSceneName为目标场景名称（默认为"开始界面"）
///    - 将返回主菜单按钮拖拽到mainMenuButton字段
/// </summary>